package com.example.artemis.statistics;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 统计服务接口
 * 定义了统计管理的核心功能
 */
public interface StatisticsService {

    /**
     * 获取全局消息统计
     *
     * @return 全局消息统计
     */
    MessageStatistics getGlobalStatistics();

    /**
     * 获取指定队列的统计
     *
     * @param queueName 队列名称
     * @return 队列统计，如果不存在则返回null
     */
    QueueStatistics getQueueStatistics(String queueName);

    /**
     * 获取所有队列的统计
     *
     * @return 队列名称到队列统计的映射
     */
    Map<String, QueueStatistics> getAllQueueStatistics();

    /**
     * 获取指定时间窗口的统计
     *
     * @param windowStart 窗口开始时间
     * @param windowSizeMinutes 窗口大小（分钟）
     * @return 时间窗口统计
     */
    TimeWindowStatistics getTimeWindowStatistics(LocalDateTime windowStart, long windowSizeMinutes);

    /**
     * 获取最近的时间窗口统计列表
     *
     * @param windowCount 窗口数量
     * @param windowSizeMinutes 每个窗口的大小（分钟）
     * @return 时间窗口统计列表
     */
    List<TimeWindowStatistics> getRecentTimeWindowStatistics(int windowCount, long windowSizeMinutes);

    /**
     * 记录消息发送事件
     *
     * @param messageId 消息ID
     * @param queueName 队列名称
     * @param producerId 生产者ID
     * @param productionTime 生产耗时
     * @param messageSize 消息大小
     */
    void recordMessageSent(String messageId, String queueName, String producerId,
                          long productionTime, int messageSize);

    /**
     * 记录消息处理成功事件
     *
     * @param messageId 消息ID
     * @param queueName 队列名称
     * @param consumerId 消费者ID
     * @param processingTime 处理耗时
     * @param deliveryAttempt 投递尝试次数
     * @param messageAge 消息年龄
     */
    void recordMessageProcessed(String messageId, String queueName, String consumerId,
                               long processingTime, int deliveryAttempt, long messageAge);

    /**
     * 记录消息处理失败事件
     *
     * @param messageId 消息ID
     * @param queueName 队列名称
     * @param consumerId 消费者ID
     * @param processingTime 处理耗时
     * @param deliveryAttempt 投递尝试次数
     * @param errorMessage 错误信息
     * @param failureType 失败类型
     * @param willRetry 是否会重试
     */
    void recordMessageFailed(String messageId, String queueName, String consumerId,
                            long processingTime, int deliveryAttempt,
                            String errorMessage, String failureType, boolean willRetry);

    /**
     * 重置所有统计数据
     */
    void resetAllStatistics();

    /**
     * 重置指定队列的统计数据
     *
     * @param queueName 队列名称
     */
    void resetQueueStatistics(String queueName);

    /**
     * 清理过期的统计数据
     */
    void cleanupExpiredStatistics();

    /**
     * 启动统计服务
     */
    void start();

    /**
     * 停止统计服务
     */
    void stop();

    /**
     * 检查服务是否正在运行
     *
     * @return 如果正在运行返回true
     */
    boolean isRunning();

    /**
     * 获取统计报告摘要
     *
     * @return 统计报告摘要
     */
    String getStatisticsSummary();

    /**
     * 获取详细统计报告
     *
     * @return 详细统计报告
     */
    String getDetailedReport();
}